package main

/*
使用Go内置的函数生成错误信息
1.errors.New()
在上一末尾提到，errors.New() 是 “errors”包中的一个内置方法。
我们导入“errors” 包之后，就可以用errors.New() 来生成错误信息了。
我们来先看看errors.New在源码中的声明：
//参数是一个字符串，返回一个错误信息
func New(text string) error

解释自己输入一个字符串参数，该函数生成（创建）并返回一个error类型数据。
*/
import "errors"

// 定义一个错误信息
var ErrDivByZero = errors.New("division by zero")

func div(x, y int) (int, error) {
	if y == 0 {
		return 0, ErrDivByZero
	}
	return x / y, nil
}
func main() {
	switch z, err := div(10, 0); err {
	case nil:
		println(z)
	case ErrDivByZero:
		panic(err) //在panic被抛出之后，如果程序里没有任何保护措施的话，程序就会打印出panic的详情，然后终止运行。
	}
}

/**
2. fmt.Errorf()
前言：
从上例中，我们可以发现 errors.New() 函数接收的参数是一个包含错误信息的 字符串 ，
然后根据这个字符串返回一个错误类型值。然而这个字符串是写好的，不能被我们格式化地去控制。
但是如果我们想更灵活地、格式化地去控制这个错误信息字符串，然后再返回错误类型，该怎么做呢？
997_格式化输出：我们已经知道，Go语言 通过调用 fmt.Sprintf() 函数，并给定占位符 %s
就可以格式化控制地打印出某个值的字符串表示形式。那我们是不是可以先用 fmt.Sprintf()
函数实现格式化控制，然后再调用 errors.New() 函数来返回错误值，来达到我们的格式化控制错误信息的目的。
答案是肯定的。
实际上，2中的两步工作，一步就可以完成。秘诀是调用 fmt.Errorf() 函数。也就是说，
当我们想通过模板化的、格式化的方式生成错误信息，并得到错误值时，可以使用 fmt.Errorf 函数。
该函数所做的其实就是先调用 fmt.Sprintf 函数，得到确切的错误信息；再调用 errors.New 函数，
得到包含该错误信息的 error 类型值，最后返回该值。
多说一嘴：

对于 error 类型值，它的字符串表示形式则取决于它的 Error 方法。
也就是说，fmt.Printf 函数如果发现被打印的值是一个 error 类型的值，
那么就会去调用它的 Error 方法。fmt 包中的这类打印函数其实都是这么做的。

*/
